freeslot("SPR_BAWH", "S_TALEZDANCE", "MT_TALEZDANCE", "S_CLOUDWER2", "SKINCOLOR_HEXAHEAVEN", "MT_CLOUDSPRING", "SPR_FVCL", "S_CLOUDSPRING", "S_CLOUDSPRING2", "MT_CLOUDWER", "SPR_HHFL", "S_CLOUDWER", "MT_CLOUDTREE", "S_CLODTR", "SPR_CLDT")

//Hang on, I need to port this shit to LUA. Screw using SOC for object definitions.
freeslot("MT_HUGGERTOBJECT",
"MT_FAVWAVEOBJECT",
"MT_FAVSTANDOBJ",
"MT_FRANKCHAIRSTAND",
"MT_DUMMIESITSTAND",
"S_HUGGERTSLEEP1",
"S_HUGGERTSLEEP2",
"S_HUGGERTSLEEP3",
"S_HUGGERTSLEEP4",
"S_FAVWAVING1",
"S_FAVSTANDING1",
"S_FAVSTANDING2",
"S_FRANKDANCINGOBJ",
"S_FRCHAIR",
"S_DUMMIESITTING",
"S_DUMMIESTANDING",
"SPR_FVOB",
"MT_SKETCHZELLEDANCE",
"S_SKETCHZELLEDANCE")

mobjinfo[MT_HUGGERTOBJECT] = {
	--$Name Huggert
	--$Sprite FVOBA1
	--$Category FavFolder
	doomednum = 4080,
	spawnstate = S_HUGGERTSLEEP1,
	radius = 25*FRACUNIT,
	height = 57*FRACUNIT,
	mass = 100,
	flags = MF_SCENERY|MF_SOLID
}
states[S_HUGGERTSLEEP1] = {SPR_FVOB, A, TICRATE, nil, 0,0, S_HUGGERTSLEEP2}
states[S_HUGGERTSLEEP2] = {SPR_FVOB, B, 5, nil, 0,0, S_HUGGERTSLEEP3}
states[S_HUGGERTSLEEP3] = {SPR_FVOB, C, TICRATE, nil, 0,0, S_HUGGERTSLEEP4}
states[S_HUGGERTSLEEP4] = {SPR_FVOB, B, 5, nil, 0,0, S_HUGGERTSLEEP1}
addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
end, MT_HUGGERTOBJECT)

mobjinfo[MT_FAVWAVEOBJECT] = {
	--$Name Fav Sona (Wave)
	--$Sprite FVOBDLDR
	--$Category FavFolder
	doomednum = 4081,
	spawnstate = S_FAVWAVING1,
	radius = 22*FRACUNIT,
	height = 57*FRACUNIT,
	mass = 100,
	flags = MF_SCENERY|MF_SOLID
}
states[S_FAVWAVING1] = {SPR_FVOB, FF_ANIMATE|D, -1, nil, 3,6, S_FAVWAVING1}
addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
end, MT_FAVWAVEOBJECT)

mobjinfo[MT_FAVSTANDOBJ] = {
	--$Name Fav Sona (Standing)
	--$Sprite FVOBH1
	--$Category FavFolder
	doomednum = 4082,
	spawnstate = S_FAVSTANDING1,
	radius = 18*FRACUNIT,
	height = 72*FRACUNIT,
	mass = 100,
	flags = MF_SCENERY|MF_SOLID
}
states[S_FAVSTANDING1] = {SPR_FVOB, H, 360, nil, 0,0, S_FAVSTANDING2}
states[S_FAVSTANDING2] = {SPR_FVOB, I, 4, nil, 0,0, S_FAVSTANDING1}
addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
end, MT_FAVSTANDOBJ)


mobjinfo[MT_FRANKCHAIRSTAND] = {
	--$Name Frank (Chair + Stand)
	--$Sprite FVOBTLTR
	--$Category FavFolder
	doomednum = 4083,
	spawnstate = S_FRCHAIR,
	radius = 20*FRACUNIT,
	height = 69*FRACUNIT,
	mass = 100,
	flags = MF_SCENERY|MF_SOLID
}
states[S_FRCHAIR] = {SPR_FVOB, T, -1, nil, 0,0, S_FRCHAIR}
states[S_FRANKDANCINGOBJ] = {SPR_FVOB, FF_ANIMATE|K, -1, nil, 8,2, S_FRANKDANCINGOBJ}
addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
end, MT_FRANKCHAIRSTAND)

mobjinfo[MT_DUMMIESITSTAND] = {
	--$Name Dummie (Sit + Stand)
	--$Sprite FVOBJ2J8
	--$Category FavFolder
	doomednum = 4086,
	spawnstate = S_DUMMIESITTING,
	radius = 16*FRACUNIT,
	height = 27*FRACUNIT,
	mass = 100,
	flags = MF_SCENERY|MF_SOLID
}
states[S_DUMMIESITTING] = {SPR_FVOB, J, -1, nil, 0,0, S_DUMMIESITTING}

addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
end, MT_DUMMIESITSTAND)

//object in an object! Free up state and object creation!
addHook("MapThingSpawn", function(mo, thing)
	if not mo.valid return end
	if (thing.options & MTF_EXTRA) then mo.frame = 20 end -- Standing ([1] Extra)
	
	if (thing.options & MTF_EXTRA) and (thing.options & MTF_OBJECTSPECIAL) -- Breakdance ([1]Extra + [4]Special)
		if mo.state != S_FRANKDANCINGOBJ then mo.state = S_FRANKDANCINGOBJ end
		mo.radius = 25*FRACUNIT
		mo.height = 45*FRACUNIT
	end
end, MT_FRANKCHAIRSTAND)

addHook("MapThingSpawn", function(mo, thing)
	if not mo.valid return end
	if (thing.options & MTF_EXTRA) then mo.frame = 21 end
end, MT_DUMMIESITSTAND)

------------- Guest Dance Objects -----------------
freeslot(
	"MT_BAPHSERVE",
	"MT_CAPTSWELL",
	"S_SERVE1",
	"S_SERVE2",
	"S_SERVE3",
	"S_SERVE4",
	"S_SERVE5",
	"S_SERVE6",
	"SPR_BAPB",
	"sfx_oink",
	"S_SWELL1",
	"S_SWELL2",
	"S_SWELL3",
	"S_SWELL4",
	"S_SWELL5",
	"S_SWELL6",
	"S_SWELL7",
	"S_SWELL8",
	"S_SWELL10",
	"S_SWELL11",
	"sfx_swell"
)

mobjinfo[MT_BAPHSERVE] = {
	--$Name BaphServe
	--$Sprite BAPBA0
	--$Category FavFolder
	doomednum = 2990,
	spawnstate = S_SERVE1,
	seestate = S_SERVE1,
	deathstate = S_SERVE5,
	deathsound = sfx_oink,
	radius = 32*FRACUNIT,
	height = 80*FRACUNIT,
	flags = MF_SPECIAL|MF_RUNSPAWNFUNC|MF_NOGRAVITY|MF_NOCLIP
}
states[S_SERVE1] = {SPR_BAPB, A, 12, A_None, 0, 0, S_SERVE2}
states[S_SERVE2] = {SPR_BAPB, B, 12, A_None, 0, 0, S_SERVE3}
states[S_SERVE3] = {SPR_BAPB, C, 12, A_None, 0, 0, S_SERVE4}
states[S_SERVE4] = {SPR_BAPB, D, 12, A_None, 0, 0, S_SERVE1}
states[S_SERVE5] = {SPR_BAPB, E, 36, A_None, 0, 0, S_SERVE6}
states[S_SERVE6] = {SPR_NULL, A, 1, A_SpawnFreshCopy, 0, 0, S_NULL}
sfxinfo[sfx_oink].caption = "Oink"
----------------------------
mobjinfo[MT_CAPTSWELL] = {
	--$Name Captian Swell Dance
	--$Sprite BAPBG0
	--$Category FavFolder
	doomednum = 2991,
	spawnstate = S_SWELL1,
	seestate = S_SWELL1,
	deathstate = S_SWELL10,
	deathsound = sfx_swell,
	radius = 32*FRACUNIT,
	height = 92*FRACUNIT,
	flags = MF_SPECIAL|MF_RUNSPAWNFUNC|MF_NOCLIP
}
sfxinfo[sfx_swell].caption = "/"
states[S_SWELL1] = {SPR_BAPB, G, 12, A_None, 0, 0, S_SWELL2}
states[S_SWELL2] = {SPR_BAPB, H, 12, A_None, 0, 0, S_SWELL3}
states[S_SWELL3] = {SPR_BAPB, I, 1, A_BunnyHop, 3, 0, S_SWELL4}
states[S_SWELL4] = {SPR_BAPB, I, 11, A_None, 0, 0, S_SWELL5}
states[S_SWELL5] = {SPR_BAPB, J, 12, A_None, 0, 0, S_SWELL6}
states[S_SWELL6] = {SPR_BAPB, H, 12, A_None, 0, 0, S_SWELL7}
states[S_SWELL7] = {SPR_BAPB, I, 1, A_BunnyHop, 3, 0, S_SWELL8}
states[S_SWELL8] = {SPR_BAPB, I, 11, A_None, 0, 0, S_SWELL1}
states[S_SWELL11] = {SPR_NULL, F, 1, A_SpawnFreshCopy, 0, 0, S_NULL}
states[S_SWELL10] = {SPR_BAPB, I, 108, A_None, 0, 0, S_SWELL11}

addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
end, MT_BAPHSERVE)
addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
	if P_IsObjectOnGround(mobj)
		mobj.info.deathstate = S_SWELL10
		mobj.flags = MF_SPECIAL|MF_RUNSPAWNFUNC|MF_NOCLIP
	else
		mobj.info.deathstate = S_NULL
		mobj.flags = MF_NOCLIPTHING
	end
end, MT_CAPTSWELL)

-------
mobjinfo[MT_TALEZDANCE] = {
	--$Name TalezDance
	--$Sprite BAWHA0
	--$Category TalezShitIGuess
	doomednum = 4085,
	spawnstate = S_TALEZDANCE,
	speed = 2*FRACUNIT,
	radius = 20*FRACUNIT,
	height = 60*FRACUNIT,
	mass = 100,
	flags = MF_SCENERY|MF_SOLID
}
states[S_TALEZDANCE] = {SPR_BAWH, FF_ANIMATE|A, -1, nil, 3,5, S_TALEZDANCE}
addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
	
	if mobj.angle == FixedAngle(1*FRACUNIT) 
		mobj.sprite = SPR_FVOB
		mobj.frame = 23
	end
end, MT_TALEZDANCE)
---------------------------
mobjinfo[MT_SKETCHZELLEDANCE] = {
	--$Name SketchZelle Dnace
	--$Sprite FVOBW1
	--$Category FavFolder
	doomednum = 4084,
	spawnstate = S_SKETCHZELLEDANCE,
	radius = 25*FRACUNIT,
	height = 25*FRACUNIT,
	mass = 15,
	flags = MF_NOCLIPTHING
}
states[S_SKETCHZELLEDANCE] = {SPR_FVOB, W, -1, nil, 0,0, S_SKETCHZELLEDANCE}
addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	if P_IsObjectOnGround(mobj) then P_SetObjectMomZ(mobj, 5*FRACUNIT) end
	mobj.shadowscale = FRACUNIT
	mobj.angle = $+FixedAngle(18*FRACUNIT)
end,MT_SKETCHZELLEDANCE)
----------------- Alright, back to what was before. ---------------------------

//i dont think i've ever seen an oldc make a skincolor for you to use at all.
//I CALL DIBS ON BEING FIRST LMAO - Fav
skincolors[SKINCOLOR_HEXAHEAVEN] = {
	name = "HexaHeaven",
	ramp = {0,0,51,51,51,33,33,205,205,205,174,174,253,253,253,253},
	invcolor = SKINCOLOR_HEXAHEAVEN,
	invshade = 14,
	chatcolor = V_ORANGEMAP,
	accessible = true
}

mobjinfo[MT_CLOUDTREE] = {
	--$Name Cloud Tree
	--$Sprite CLDTA0
	--$Category FavFolder
	doomednum = 4067,
	spawnhealth = 1,
	spawnstate = S_CLODTR,
	radius = 27*FRACUNIT,
	height = 105*FRACUNIT,
	flags = MF_SOLID|MF_SCENERY
}
states[S_CLODTR] = {SPR_CLDT, A, -1, nil, 0, 0, S_CLODTR}

mobjinfo[MT_CLOUDWER] = {
	--$Name Cloudwer
	--$Sprite HHFLA0
	--$Category FavFolder
	doomednum = 4072,
	spawnhealth = 1,
	spawnstate = S_CLOUDWER,
	radius = 25*FRACUNIT,
	height = 25*FRACUNIT,
	flags = MF_SCENERY
}
states[S_CLOUDWER] = {SPR_HHFL, FF_ANIMATE|A, -1, nil, 5,6, S_CLOUDWER}
states[S_CLOUDWER2] = {SPR_HHFL, FF_ANIMATE|G, -1, nil, 5,6, S_CLOUDWER2}

mobjinfo[MT_CLOUDSPRING] = {
	--$Name Cloud Spring
	--$Sprite FVCLA0
	--$Category FavFolder
	doomednum = 4071,
	spawnhealth = 1,
	painchance = 1,
	painsound = sfx_s3k87,
	spawnstate = S_CLOUDSPRING,
	raisestate = S_CLOUDSPRING2,
	radius = 55*FRACUNIT,
	height = 45*FRACUNIT,
	mass = 20*FRACUNIT,
	flags = MF_SCENERY|MF_SPRING|MF_NOGRAVITY
}
states[S_CLOUDSPRING] = {SPR_FVCL, FF_FULLBRIGHT|A, -1, nil, 0, 0, S_CLOUDSPRING}
states[S_CLOUDSPRING2] = {SPR_FVCL, FF_FULLBRIGHT|A, 2, A_Pain, 0, 0, S_CLOUDSPRING}
addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) return end	
	mobj.shadowscale = FRACUNIT
end, MT_CLOUDSPRING)

addHook("MobjThinker", function(tree)
	if not tree and tree.valid return end
	if tree.angle == 0 and tree.frame != 0 then tree.frame = 0 end
	if tree.angle == FixedAngle(1*FRACUNIT) and tree.frame != 1 then tree.frame = 1 end
	if tree.angle == FixedAngle(2*FRACUNIT) and tree.frame != 2 then tree.frame = 2 end
	if tree.angle == FixedAngle(3*FRACUNIT) and tree.frame != 3 then tree.frame = 3 end
	tree.spritexscale = FRACUNIT*(2)
	tree.spriteyscale = FRACUNIT*(2)
end, MT_CLOUDTREE)

addHook("MobjThinker", function(cloud)
	if not (cloud and cloud.valid) return end
	
	if cloud.angle != 0 and cloud.angle <= FixedAngle(6*FRACUNIT) then cloud.scale = (AngleFixed(cloud.angle)/2) end
	
	if (leveltime % 8 == 0)
		for i = 0, 2 -- bottom fx
			local thic = 25
			local divetrail = P_SpawnMobjFromMobj(cloud, P_RandomRange(-1*thic, thic)*cloud.scale, P_RandomRange(-1*thic, thic)*cloud.scale, - 15*FRACUNIT, MT_THOK)
			
			divetrail.fuse = TICRATE/3
			divetrail.scale = $/3
			divetrail.state = S_CLOUDSPRING
			divetrail.blendmode = AST_ADD
			divetrail.momx = P_RandomRange(-1, 1)*FRACUNIT
			divetrail.momy = P_RandomRange(-1, 1)*FRACUNIT
			divetrail.momz = P_RandomRange(-1, 1)*FRACUNIT
		end
	end
	
	if cloud.state == S_CLOUDSPRING2
		for i = 1,12
			local fa = (i*ANG30)
			local mo = P_SpawnGhostMobj(cloud)
			mo.scale = cloud.scale
			if mo and mo.valid
				mo.momy = FixedMul(cos(fa), 10*FRACUNIT)
				mo.momx = FixedMul(sin(fa), 10*FRACUNIT)
				mo.momz = 10*FRACUNIT
			end
			mo.destscale = 0
			mo.scalespeed = FRACUNIT/18
			i = $+1
		end
	end
end, MT_CLOUDSPRING)

addHook("MobjThinker", function(flower)
	if not flower and flower.valid return end
	if flower.angle != 0 and flower.state != S_CLOUDWER2 then flower.state = S_CLOUDWER2 end
end, MT_CLOUDWER)

addHook("PlayerSpawn", function(player)
	if player.cutspringge != 0
		player.pflags = $1 & ~PF_FULLSTASIS
		player.cutspringge = 0
		player.mo.rollangle = 0
	end
end)

addHook("PlayerThink", function(player)
	if not (player.mo and player.mo.valid) return end
	if player.cutspringge == nil 
		player.cutspringge = 0
		player.hexalized = false
	end
	
	if player.skincolor == SKINCOLOR_HEXAHEAVEN
		player.hexalized = true
		if not player.mo.colorized and not player.powers[pw_super] then player.mo.colorized = true end
	end
	if player.powers[pw_super] and player.skincolor == SKINCOLOR_HEXAHEAVEN and player.mo.colorized then player.mo.colorized = false end
	
	if (player.skincolor != SKINCOLOR_HEXAHEAVEN) and player.hexalized and player.mo.colorized
		S_StartSoundAtVolume(player.mo, sfx_ghit, 45)
		for i = 1,10
			local gloop = P_SpawnMobjFromMobj(player.mo, 0,0,0, MT_GOOPTRAIL)
			gloop.color = SKINCOLOR_HEXAHEAVEN
			gloop.colorized = true
			gloop.flags = $ & ~(MF_NOGRAVITY)
			gloop.fuse = TICRATE*4
			gloop.destscale = 0
			gloop.scalespeed = TICRATE/27
			gloop.momx = P_RandomRange(-3, 3)*FRACUNIT
			gloop.momy = P_RandomRange(-3, 3)*FRACUNIT
			gloop.momz = P_RandomRange(2, 8)*FRACUNIT
		end
		player.mo.color = player.skincolor
		player.mo.colorized = false
		player.hexalized = false
	end
	
	//Palette fixes because i know ONE of yalls is gonna bring some kind of shield in here
	if player.fuckinghexhevnukefix == nil or not (mapheaderinfo[gamemap].ishexahev) then player.fuckinghexhevnukefix = false end
	
	if player.fuckinghexhevnukefix and not(not (CV_FindVar("gr_paletterendering")) and CV_FindVar("renderer").value == 2 or CV_FindVar("gr_paletterendering") and CV_FindVar("gr_paletterendering").value == 0 and CV_FindVar("renderer").value == 2)
		P_FlashPal(player, 8, 1)
	end
	
	//the cutscene junk
	if player.cutspringge != 0
		player.cutspringge = $+1
		player.pflags = $|PF_FULLSTASIS
		player.pflags = $|PF_THOKKED
		
		if player.cutspringge == 15 --first cam shot
			COM_BufInsertText(player, "tunes \"-default\"")
			if player.mo.x != -11133 then P_MoveOrigin(player.mo, -11133*FRACUNIT, -5233*FRACUNIT, 584*FRACUNIT) end  -- you aint slick, watch the fuckin cutscene.
		end
		
		if player.cutspringge > 10
		
			if not multiplayer and players[1] and players[1].valid
				players[1].mo.momz = -1*FRACUNIT
				players[0].mo.momz = -2*FRACUNIT
			else
				player.mo.momz = -2*FRACUNIT
			end
			if player.cutspringge >= 584 and player.cutspringge < 800
				player.mo.state = S_PLAY_PAIN
				player.drawangle = $ + FixedAngle(25*FRACUNIT)
				
			elseif player.cutspringge >= 1133 and player.cutspringge < 1314
				player.drawangle = $ + FixedAngle(8*FRACUNIT)
				player.mo.state = S_PLAY_FALL
			elseif player.cutspringge >= 1340 and player.cutspringge < 1559
				player.mo.rollangle = $ + FixedAngle(10*FRACUNIT)
				player.mo.state = S_PLAY_FALL
			else player.mo.state = S_PLAY_FALL end
			
			
			if player.cutspringge == 1600
				player.cutspringge = -1
				player.mo.rollangle = 0
				player.pflags = $1 & ~PF_FULLSTASIS
			end
		end
	end	
end)

addHook("PlayerThink", function(p) -- frostii's quick implement
	if (mapheaderinfo[gamemap].ishexahev) or (not (CV_FindVar("gr_paletterendering")) and CV_FindVar("renderer").value == 2 or CV_FindVar("gr_paletterendering") and CV_FindVar("gr_paletterendering").value == 0 and CV_FindVar("renderer").value == 2)
		return
	end
	if p.mo and p.skincolor == SKINCOLOR_HEXAHEAVEN
		P_FlashPal(p, 8, 1)
	end
end)

local function SpringIntro(line, mo)
	local player = mo.player
	mo.momz = 25*FRACUNIT
	player.cutspringge = 1
	
	if player.mo and player.mo.valid 
	and not multiplayer and players[1] and players[1].valid
		players[1].cutspringge = 1
	end
end
addHook("LinedefExecute", SpringIntro, "FAVSPG")

local function HexaPalOff(line, mo)
	mo.player.fuckinghexhevnukefix = false
	if (not (CV_FindVar("gr_paletterendering")) and CV_FindVar("renderer").value == 2 or CV_FindVar("gr_paletterendering") and CV_FindVar("gr_paletterendering").value == 0 and CV_FindVar("renderer").value == 2)
		return
	end
	P_FlashPal(mo.player, 8, 1)
end
addHook("LinedefExecute", HexaPalOff, "FAVHEX0")

local function HexaPalOn(line, mo)
	mo.player.fuckinghexhevnukefix = true
	if (not (CV_FindVar("gr_paletterendering")) and CV_FindVar("renderer").value == 2 or CV_FindVar("gr_paletterendering") and CV_FindVar("gr_paletterendering").value == 0 and CV_FindVar("renderer").value == 2)
		return
	end
	P_FlashPal(mo.player, 8, -1)
end
addHook("LinedefExecute", HexaPalOn, "FAVHEX1")
------------------------------------------------

local function FavSpringFade(d, p, cam)
	if not (p.mo and p.mo.valid) return end
	if p.cutspringge > 0
		
		if p.cutspringge <= 10
			local maxfader = p.cutspringge*5 + 1
			if maxfader > 31 then maxfader = 31 end
			d.fadeScreen(0xFB00, maxfader)
		elseif p.cutspringge <= 13 
			d.fadeScreen(0xFB00, 25)
		elseif p.cutspringge <= 16 
			d.fadeScreen(0xFB00, 20)
		elseif p.cutspringge <= 19 
			d.fadeScreen(0xFB00, 15)		
		elseif p.cutspringge <= 22 
			d.fadeScreen(0xFB00, 10)
		elseif p.cutspringge <= 25 
			d.fadeScreen(0xFB00, 5)
		end
	end
end
hud.add(FavSpringFade, "game")